#ifndef ASL_LIB_JSON_H
#define ASL_LIB_JSON_H

#ifdef    __cplusplus
extern "C" {
#endif

#ifndef    NULL
#define    NULL 0
#endif

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <assert.h>

typedef enum {
    JSON_NONE,
    JSON_STRING,
    JSON_INTEGER,
    JSON_DOUBLE,
    JSON_LONGLONG,
    JSON_FLOAT,
    JSON_OBJECT,
    JSON_ARRAY,
    JSON_TRUE,
    JSON_FALSE,
    JSON_NULL
} json_type_t;

typedef struct json_object_s {
    size_t object_type: 4;
    size_t value_type: 4;
#if (defined __x86_64__) || (defined _WIN64)
    size_t key_len:18;
    size_t value_len:38;
#else
    size_t key_len: 8;
    size_t value_len: 16;
#endif
    union {
        double d;
        float f;
        long long l;
        int i;
        char *s;
        struct json_object_s *p;
    } value;
    char *key;
    struct json_object_s *next;
} json_object_t;

typedef struct json_task_s {
    char *err_msg;
    unsigned int count;
    unsigned int status;
    char *str;
    unsigned int len;

    void (*callback)(struct json_task_s *task, json_object_t *node);

    json_object_t *root;
} json_task_t;

int json_parser(json_task_t *task);

void json_err_psotion(json_task_t *task, int *line, int *row);

json_object_t *
json_append(json_object_t *obj, const char *key, size_t key_len, json_type_t value_type, void *value, size_t value_len);

json_object_t *json_create_object();

json_object_t *json_create_array();

json_object_t *json_duplicate_object(json_object_t *obj);

void json_delete_object(json_object_t *obj);

void json_print_value(json_object_t *obj, char **buf, size_t *buf_len);

void json_print(json_object_t *obj, char **buf, size_t *buf_len);

#ifdef    __cplusplus
}
#endif

#endif
